home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / debug / 2b_MungFriend.lha / source / MungFriend.s < prev   
Encoding:
Text File  |  1998-09-09  |  16.8 KB  |  762 lines

  1. *-----------------------*
  2. *    MungFriend
  3. *    version 3.7 (rev 17)
  4. *    © 1995-98 Szymon Pura and David Zaroski
  5. *    KickStart 2.0 required
  6. *-----------------------*
  7.  
  8. ***************************** VERSION HISTORY ******************************
  9. **                                                                        **
  10. **  V2.0    28.02.96    Initial release                                   **
  11. **  V2.1    04.03.96    TYPE & WRITE fixed                                **
  12. **          06.03.96    REMOVE fixed                                      **
  13. **          27.03.96    WRITE fixed                                       **
  14. **          09.04.96    Minor fixes                                       **
  15. **          27.05.96    Memory allocation fixed                           **
  16. **  V2.2    26.06.96    NOBELL option added                               **
  17. **  V2.3    17.11.96    FindResNode fixed                                 **
  18. **                      Priority set to 120                               **
  19. **                      KickMemList replaces AllocAbs()'es in InitProc    **
  20. **  V3.0    19.11.96    Totally redone memory allocation                  **
  21. **                      Priority set to 0                                 **
  22. **                      INFO improved                                     **
  23. **  V3.1    24.01.97    TYPE & WRITE improved                             **
  24. **                      Cache cleared                                     **
  25. **                      ROMTag fixed                                      **
  26. **  V3.1a   22.02.97    Should work correctly under -OS3.0                **
  27. **                        'BufferSize' error fixed  **
  28. **  V3.2    01.09.97    Another bug(/strange behaviour) fixed             **
  29. **  V3.3    02.10.97                                                      **
  30. **  V3.4    18.10.97    Oops, WRITE didn't check the buffer               **
  31. **  V3.5    22.12.97    Introduced checks against trashed KickTags.       **
  32. **                      (thanks, Dave!)                                   **
  33. **  V3.6    27.02.98    Great deal of bugs fixed                          **                                                                        **
  34. **  V3.7    09.09.98    Yet another bug fixed...                          **
  35. ****************************************************************************
  36.  
  37.  
  38.     include    MOOPS2:EInclude.m
  39.  
  40.     EInclude    DOS,DOS
  41.     EInclude    DOS,DOSEXTENS
  42.     EInclude    DOS,DOS_LIB
  43.     EInclude    EXEC,EXECBASE
  44.     EInclude    EXEC,EXEC_LIB
  45.     EInclude    EXEC,LIBRARIES
  46.     EInclude    EXEC,MEMORY
  47.     EInclude    EXEC,RESIDENT
  48.     EInclude    EXEC,STRINGS
  49.     EInclude    EXEC,TYPES
  50.     EInclude    HARDWARE,CUSTOM
  51.  
  52. MYVERSION    equ    3
  53. MYREVISION    equ    7
  54. custombase    equ    $dff000
  55.  
  56.     ifnd    _LVORawPutChar      * not defined in exec_lib.i
  57. _LVORawPutChar    equ    -516
  58.     endc
  59.  
  60. *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  61.  
  62.     STRUCTURE    MFResidentNode,0
  63.  
  64.     STRUCT  mfrn_allocabspad,8    ; system memory node here
  65.     
  66.     STRUCT    mfrn_Resident,RT_SIZE
  67.     STRUCT    mfrn_IDString,60
  68.     STRUCT    mfrn_NameString,12
  69.     STRUCT    mfrn_Reserved,20    ; unused at the moment...
  70.  
  71.  
  72. ; start of the MemList structure
  73.  
  74.     LABEL    mfrn_MemList
  75.     STRUCT    mfrn_Node,LN_SIZE
  76.     UWORD    mfrn_NumEntries    ; just one entry...
  77.     APTR    mfrn_NodePtr
  78.     ULONG    mfrn_NodeSize
  79.  
  80.     ULONG    mfrn_CharsInBuff
  81.     ULONG    mfrn_BufferSize
  82.  
  83.     APTR    mfrn_MyResident
  84.     APTR    mfrn_Succ
  85.     ULONG    mfrn_null    ; end of the array
  86.  
  87.     UWORD    mfrn_Version
  88.     UWORD    mfrn_Revision
  89.     UBYTE    mfrn_Flags
  90.     UBYTE    pad    ; unused at the moment...
  91.  
  92.  
  93. ; special procs
  94.  
  95.     STRUCT    mfrn_InitProc,50    * only about 30 bytes needed...
  96.     STRUCT    mfrn_PatchProc,200    * only about 130 bytes needed...
  97.     APTR    mfrn_OldVector    * original _LVORawPutChar address
  98.  
  99. ; buffer starts here
  100.  
  101.     LABEL    mfrn_Buffer
  102.     LABEL    mfrn_SIZEOF
  103.  
  104. ; defs for mfrn_Flags
  105.  
  106.     BITDEF    MFRN,FLASH,0
  107.     BITDEF    MFRN,SERIAL,1
  108.     BITDEF    MFRN,TRACE,2
  109.     BITDEF    MFRN,PATCHED,3
  110.     BITDEF    MFRN,OVERFLOW,4
  111.     BITDEF    MFRN,NOBELLS,5
  112.  
  113. ****************************************************************************
  114.  
  115. Start    lea    DosLibName(pc),a1
  116.     moveq    #0,d0
  117.     CALLEXEC    OpenLibrary
  118.     move.l    d0,_DOSBase
  119.     move.l    d0,a6
  120.     JSRL    Input
  121.     move.l    d0,MyInput
  122.     JSRL    Output
  123.     move.l    d0,MyOutput
  124.     move.w    LIB_VERSION(a6),d0
  125.     cmpi.w    #35,d0
  126.     bhi    strt_0
  127.     move.l    a6,a1
  128.     CALLEXEC    CloseLibrary
  129.     moveq    #RETURN_FAIL,d0
  130.     rts
  131. strt_0    lea    MyTemplate(pc),a1
  132.     move.l    a1,d1
  133.     lea    MyArgTable,a2
  134.     move.l    a2,d2
  135.     moveq    #0,d3
  136.     JSRL    ReadArgs
  137.     move.l    d0,ArgPtr
  138.     bne    strt_1
  139.     JSRL    IoErr
  140.     moveq    #0,d2
  141.     JSRL    PrintFault
  142.     movea.l    a6,a1
  143.     CALLEXEC    CloseLibrary
  144.     moveq    #RETURN_FAIL,d0
  145.     rts
  146. strt_1    moveq    #-1,d0
  147.     moveq    #6,d1
  148.     move.l    a2,a0
  149. strt_c    tst.l    (a0)+
  150.     sne    d2
  151.     andi.b    #1,d2
  152.     add.b    d2,d0
  153.     dbf    d1,strt_c
  154.     tst.b    d0
  155.     beq    strt_2
  156.     addq.b    #1,d0
  157.     beq    strt_2
  158.     lea    TooManyCommands(pc),a0
  159. QuitStrErr
  160.     bsr    PrintString
  161. QuitErr    bsr    Quit
  162.     moveq    #RETURN_FAIL,d0
  163.     rts
  164. Quit    move.l    ArgPtr(pc),d1
  165.     CALLDOS    FreeArgs
  166.     move.l    a6,a1
  167.     CALLEXEC    CloseLibrary
  168.     rts
  169. FlagError
  170.     lea    FlagErrorTxt(pc),a0
  171.     bra    QuitStrErr
  172. strt_2    bsr    FindResNode
  173.     move.l    d0,MFNode
  174.     move.l    d0,a3
  175.     move.l    a2,a0
  176.     tst.l    36(a0)
  177.     beq    strt_3
  178.     tst.l    40(a0)
  179.     bne    FlagError
  180. strt_3    tst.l    44(a0)
  181.     beq    strt_4
  182.     tst.l    48(a0)
  183.     bne    FlagError
  184. strt_4    tst.l    52(a0)
  185.     beq    strt_5
  186.     tst.l    56(a0)
  187.     bne    FlagError
  188. strt_5    tst.l    60(a0)
  189.     beq    strt_f
  190.     tst.l    64(a0)
  191.     bne    FlagError
  192. strt_f    tst.l    MFNode
  193.     beq    strt_b
  194.     tst.l    36(a0)
  195.     beq    strt_6
  196.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  197. strt_6    tst.l    40(a0)
  198.     beq    strt_7
  199.     bclr    #MFRNB_FLASH,mfrn_Flags(a3)
  200. strt_7    tst.l    52(a0)
  201.     beq    strt_8
  202.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  203.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  204.     bne    strt_8
  205.     movem.l    a0/a1/a6,-(sp)
  206.     movea.l    4.w,a6
  207.     lea    mfrn_PatchProc(a3),a0
  208.     move.l    a0,d0
  209.     lea    _LVORawPutChar,a0
  210.     move.l    a6,a1
  211.     JSRL    Disable
  212.     JSRL    SetFunction
  213.     JSRL    Enable
  214.     move.l    d0,mfrn_OldVector(a3)
  215.     movem.l    (sp)+,a0/a1/a6
  216. strt_8    tst.l    56(a0)
  217.     beq    strt_9
  218.     bclr    #MFRNB_TRACE,mfrn_Flags(a3)
  219. strt_9    tst.l    44(a0)
  220.     beq    strt_a
  221.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  222. strt_a    tst.l    48(a0)
  223.     beq    strt_d
  224.     bclr    #MFRNB_SERIAL,mfrn_Flags(a3)
  225. strt_d    tst.l    60(a0)
  226.     beq    strt_e
  227.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  228. strt_e    tst.l    64(a0)
  229.     beq    strt_b
  230.     bclr    #MFRNB_NOBELLS,mfrn_Flags(a3)
  231. strt_b    tst.l    (a0)+
  232.     bne    f_Info
  233.     tst.l    (a0)+
  234.     bne    f_Install
  235.     tst.l    (a0)+
  236.     bne    f_Clear
  237.     tst.l    (a0)+
  238.     bne    f_Remove
  239.     tst.l    (a0)+
  240.     bne    f_Type
  241.     tst.l    (a0)+
  242.     bne    f_Write
  243.     tst.l    (a0)
  244.     bne    QuitOk
  245.     lea    NoCommand(pc),a0
  246.     bra    QuitStrErr
  247. f_Info    tst.l    MFNode
  248.     beq    NotInstalled
  249.     move.l    MFNode(pc),a2
  250.     lea    InfoFormat(pc),a0
  251.     move.l    a0,d2
  252.     move.l    MyOutput(pc),d1
  253.     lea    InfoFormatArgs(pc),a0
  254.     move.l    a0,d3
  255.     move.l    mfrn_BufferSize(a2),d0
  256.     move.l    d0,(a0)+
  257.     lea    NoTraceT(pc),a1
  258.     move.l    a1,(a0)+
  259.     btst    #MFRNB_TRACE,mfrn_Flags(a2)
  260.     beq    finf_0
  261.     addq.l    #2,-4(a0)
  262. finf_0    lea    NoSerialT(pc),a1
  263.     move.l    a1,(a0)+
  264.     btst    #MFRNB_SERIAL,mfrn_Flags(a2)
  265.     beq    finf_1
  266.     addq.l    #2,-4(a0)
  267. finf_1    lea    NoFlashT(pc),a1
  268.     move.l    a1,(a0)+
  269.     btst    #MFRNB_FLASH,mfrn_Flags(a2)
  270.     beq    finf_2
  271.     addq.l    #2,-4(a0)
  272. finf_2    lea    NoBellsT(pc),a1
  273.     move.l    a1,(a0)+
  274.     btst    #MFRNB_NOBELLS,mfrn_Flags(a2)
  275.     bne    finf_3
  276.     lea    BellsT(pc),a1
  277.     move.l    a1,(a0)+
  278. finf_3    move.l    mfrn_CharsInBuff(a2),CharsInBuffSpace
  279.     CALLDOS    VFPrintf
  280.     bra    QuitOk
  281. f_Clear    tst.l    MFNode
  282.     beq    NotInstalled
  283.     move.l    MFNode(pc),a2
  284.     clr.l    mfrn_CharsInBuff(a2)
  285.     bclr    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  286.     bra    QuitOk
  287. f_Remove
  288.     tst.l    MFNode
  289.     beq    NotInstalled
  290.     move.l    MFNode(pc),a2
  291.     movea.l    4.w,a6
  292.     btst    #MFRNB_PATCHED,mfrn_Flags(a2)
  293.     beq    frem_3
  294.     lea    _LVORawPutChar,a0
  295.     move.l    mfrn_OldVector(a2),d0
  296.     move.l    a6,a1
  297.     JSRL    Disable
  298.     JSRL    SetFunction
  299.     lea    mfrn_PatchProc(a2),a0
  300.     cmp.l    a0,d0
  301.     beq    frem_3
  302.     move.l    a6,a1
  303.     lea    _LVORawPutChar,a0
  304.     JSRL    SetFunction
  305.     JSRL    Enable
  306.     lea    CantQuitTxt(pc),a0
  307.     bra    QuitStrErr
  308. frem_3    JSRL    Enable
  309.     move.l    MFNode(pc),a0
  310. ;dz
  311.     addq.l    #mfrn_Resident,a0
  312. ;dz
  313.     JSRL    Forbid
  314.     lea    KickTagPtr(a6),a3
  315.     move.l     (a3),a2
  316. frem_0    move.l    (a2),a1
  317.     move.l    a1,d0
  318.     beq    frem_1
  319.     bmi    frem_A
  320.     cmpa.l    a0,a1
  321.     beq    frem_2
  322.     addq.l    #4,a2
  323.     bra    frem_0
  324. frem_A    bclr    #31,d0
  325.     move.l    a2,a3
  326.     move.l    d0,a2
  327.     bra    frem_0
  328. frem_2: move.l    MFNode(pc),a0
  329.     move.l    mfrn_Succ(a0),d1
  330.     move.l    d1,(a3)
  331.     bclr    #7,KickTagPtr(a6)
  332. frem_1    lea    KickMemPtr(a6),a2
  333.     move.l    MFNode(pc),a0
  334.     lea    mfrn_Node(a0),a0
  335. 1$    move.l    (a2),a1
  336.     move.l    a1,d0
  337.     beq    2$
  338.     cmpa.l    a0,a1
  339.     beq    3$
  340.     move.l    (a2),a2
  341.     bra    1$
  342. 3$    move.l    (a0),(a2)
  343. 2$    JSRL    SumKickData
  344.     move.l    d0,KickCheckSum(a6)
  345.     JSRL    CacheClearU
  346.  
  347. ; now we need to remove MF node from the ResModules list
  348.     lea    MyNameString(pc),a1
  349.     JSRL    FindResident
  350.     tst.l    d0
  351.     beq    4$    ; oh, a pre-reset situation :)
  352.     lea    ResModules(a6),a3
  353.     move.l    (a3),d1
  354.     beq    4$    ; this should never happen, but just in case of fire
  355.     move.l    d1,a0
  356. 5$    move.l    (a0),d1
  357.     beq    4$    ; now that's strange
  358.     bclr    #31,d1
  359.     beq    7$    ; new array
  360.     move.l    a0,a3
  361.     move.l    d1,a0
  362.     bra    5$
  363. 7$    cmp.l    d0,d1
  364.     beq    6$    ; here you are
  365.     addq.l    #4,a0
  366.     bra    5$
  367. 6$    move.l    4(a0),(a0)+
  368.     bne    6$    ; now we're ready
  369.     move.l    (a3),d0
  370.     bclr    #1,d0
  371.     move.l    d0,a0
  372.     tst.l    (a0)
  373.     bne    4$
  374.     clr.l    (a3)    ; let's delete the whole table
  375. 4$    JSRL    Permit
  376. ;    move.l    MFNode(pc),a0    ; memory won't be freed until the next reset :-(
  377. ;    bsr    FreeResNode
  378.     bra    QuitOk
  379. NoMemory
  380.     lea    NoMemoryTxt(pc),a0
  381.     bra    QuitStrErr
  382. NoBuffSize
  383.     lea    NoBuffSizeTxt(pc),a0
  384.     bra    QuitStrErr
  385. f_Install
  386.     tst.l    MFNode
  387.     bne    AlreadyInstalled
  388.     move.l    28(a2),d0
  389.     beq    NoBuffSize
  390.     move.l    28(a2),a0
  391.     move.l    (a0),d0
  392. ;    cmpi.l    #10239,d0        ; is this really necessary?
  393. ;    bhi    1$
  394. ;    lea    Using10KBTxt(pc),a0
  395. ;    bsr    PrintString
  396. ;    move.l    #10240,d0
  397. 1$    bsr    CreateNode
  398.     tst.l    d0
  399.     beq    NoMemory
  400.     move.l    d0,a3
  401.     move.l    d0,MFNode
  402.     tst.l    44(a2)
  403.     beq    finst_0
  404.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  405. finst_0    tst.l    36(a2)
  406.     beq    finst_1
  407.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  408. finst_1    tst.l    52(a2)
  409.     beq    finst_2
  410.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  411.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  412.     movea.l    4.w,a6
  413.     lea    _LVORawPutChar,a0
  414.     lea    mfrn_PatchProc(a3),a1
  415.     move.l    a1,d0
  416.     move.l    a6,a1
  417.     JSRL    SetFunction
  418.     move.l    d0,mfrn_OldVector(a3)
  419. finst_2    tst.l    60(a2)
  420.     beq    finst_3
  421.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  422. finst_3    movea.l    4.w,a6
  423.     JSRL    Forbid
  424.     JSRL    Disable
  425.     move.l    KickTagPtr(a6),d0
  426.     beq.s    nokicktags
  427.     bset    #31,d0
  428.     move.l    d0,mfrn_Succ(a3)
  429. nokicktags:
  430.     lea.l    mfrn_MyResident(a3),a0            ;dz
  431.     move.l    a0,KickTagPtr(a6)                ;dz
  432.     move.l    KickMemPtr(a6),mfrn_Node(a3)
  433.     lea    mfrn_MemList(a3),a0
  434.     move.l    a0,KickMemPtr(a6)
  435.     JSRL    Enable
  436.     JSRL    SumKickData
  437.     move.l    d0,KickCheckSum(a6)
  438.     JSRL    Permit
  439.     bra    QuitOk
  440. AlreadyInstalled
  441.     lea    AlreadyInstalledTxt(pc),a0
  442.     bsr    PrintString
  443.     bra    QuitOk
  444. NotInstalled
  445.     lea    NotInstalledTxt(pc),a0
  446.     bsr    PrintString
  447. QuitOk    bsr    Quit
  448.     moveq    #RETURN_OK,d0
  449.     rts
  450. PrintString    * (string)(a0)
  451.     move.l    a6,-(sp)
  452.     move.l    a0,d1
  453.     CALLDOS    PutStr
  454.     move.l    (sp)+,a6
  455.     rts
  456. FindResNode    * () -> resnode/NULL
  457.     movem.l    a2/a3/a6,-(sp)
  458.     CALLEXEC    Forbid
  459.     lea    MyNameString(pc),a3
  460.     move.l    KickTagPtr(a6),a2
  461.     move.l    a2,d0                
  462.     beq    1$                    ;must check for null
  463. 3$    move.l    (a2)+,d0
  464.     beq    1$
  465.     bpl    2$
  466.     bclr    #31,d0
  467.     move.l    d0,a2
  468.     bra    3$
  469. 2$    move.l    d0,a1
  470.     move.l    a3,a0
  471.     move.l    RT_NAME(a1),a1
  472. 4$    cmpm.b    (a0)+,(a1)+
  473.     bne    3$
  474.     tst.b    -1(a0)
  475.     bne    4$
  476. 1$    JSRL    Permit
  477.     tst.l    d0
  478.     beq    5$
  479.     subq.l    #mfrn_Resident,d0    ; the mfrn_allocabspad
  480. 5$    movem.l    (sp)+,a6/a2/a3
  481.     rts
  482. FreeResNode    * (node)(a0)
  483.     move.l    a6,-(sp)
  484.     move.l    mfrn_NodeSize(a0),d0
  485.     move.l    a0,a1
  486.     CALLEXEC    FreeMem
  487.     move.l    (sp)+,a6
  488.     rts
  489. crn_failed
  490.     movem.l    (sp)+,d2/a2/a3/a6
  491.     rts
  492. CreateNode    * (buffsize)(d0) -> node
  493.     movem.l    d2/a2/a3/a6,-(sp)
  494.     move.l    d0,d2
  495.     move.l    #MEMF_KICK!MEMF_PUBLIC!MEMF_CLEAR!MEMF_LOCAL,d1
  496.     add.l    #mfrn_SIZEOF,d0
  497.     movea.l    4.w,a6
  498.     cmpi.w    #38,LIB_VERSION(a6)
  499.     bhi    5$
  500.     bclr    #MEMB_KICK,d1
  501. 5$    move.l    d0,-(sp)
  502.     JSRL    AllocMem
  503.     move.l    (sp)+,d1
  504.     tst.l    d0
  505.     beq    crn_failed
  506.     move.l    d0,a2
  507.     move.l    d0,mfrn_NodePtr(a2)
  508.     move.l    d1,mfrn_NodeSize(a2)
  509.     move.l    d2,mfrn_BufferSize(a2)
  510.     lea    mfrn_Resident(a2),a1
  511.     move.l    a1,mfrn_MyResident(a2)
  512.     move.w    #RTC_MATCHWORD,RT_MATCHWORD(a1)
  513.     move.b    #0,RT_PRI(a1)
  514.     move.l    a1,RT_MATCHTAG(a1)
  515.     move.b    #RTF_COLDSTART,RT_FLAGS(a1)
  516.     move.b    #MYVERSION,RT_VERSION(a1)
  517.     lea    MyNameString(pc),a0
  518.     lea    mfrn_NameString(a2),a3
  519.     move.l    a3,RT_NAME(a1)
  520. 1$    move.b    (a0)+,(a3)+
  521.     bne    1$
  522.     lea    MyIDString(pc),a0
  523.     lea    mfrn_IDString(a2),a3
  524.     move.l    a3,RT_IDSTRING(a1)
  525. 2$    move.b    (a0)+,(a3)+
  526.     bne    2$
  527.     lea    MyPatchProc(pc),a0
  528.     lea    mfrn_PatchProc(a2),a3
  529.     move.l    #MyPatchProcE-MyPatchProc-1,d0
  530. 3$    move.b    (a0)+,(a3)+
  531.     dbf    d0,3$
  532.     lea    MyInitProc(pc),a0
  533.     lea    mfrn_InitProc(a2),a3
  534.     move.l    a3,RT_INIT(a1)
  535.     move.l    #MyInitProcE-MyInitProc-1,d0
  536. 4$    move.b    (a0)+,(a3)+
  537.     dbf    d0,4$
  538.     move.w    #1,mfrn_NumEntries(a2)
  539.     move.l    a2,d0
  540.     movem.l    (sp)+,d2/a2/a3/a6
  541.     rts
  542. f_Type    tst.l    MFNode
  543.     beq    NotInstalled
  544.     move.l    MyOutput(pc),d2
  545.     bsr    DoType
  546.     moveq    #LF,d2
  547.     move.l    MyOutput(pc),d1
  548.     CALLDOS    FPutC
  549.     move.l    MFNode(pc),a2
  550.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  551.     beq    QuitOk
  552.     lea    BuffOverflow(pc),a0
  553.     bsr    PrintString
  554.     bra    QuitOk
  555. BadFileName
  556.     lea    BadFileNameTxt(pc),a0
  557.     bra    QuitStrErr
  558. f_Write
  559.     tst.l    MFNode
  560.     beq    NotInstalled
  561.     move.l    32(a2),d0
  562.     beq    BadFileName
  563.     move.l    d0,d1
  564.     move.l    #MODE_NEWFILE,d2
  565.     CALLDOS    Open
  566.     move.l    d0,d7
  567.     bne    fwrt_0
  568.     CALLDOS    IoErr
  569.     move.l    d0,d1
  570.     moveq    #0,d2
  571.     CALLDOS    PrintFault
  572.     bra    QuitErr
  573. fwrt_0    move.l    d7,d2
  574.     bsr    DoType
  575.     tst.l    d0
  576.     bne    fwrt_1
  577.     move.l    MFNode(pc),a2
  578.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  579.     beq    fwrt_1
  580.     lea    BuffOverflow(pc),a0
  581.     move.l    d7,d1
  582.     move.l    a0,d2
  583.     CALLDOS    FPuts
  584.     tst.l    d0
  585.     beq    fwrt_1
  586.     JSRL    IoErr
  587.     move.l    d0,d1
  588.     moveq    #0,d2
  589.     JSRL    PrintFault
  590.     bra    fwrt_2
  591. fwrt_1    move.l    d7,d1
  592.     CALLDOS    Close
  593.     bra    QuitOk
  594. fwrt_2    move.l    d7,d1
  595.     CALLDOS    Close
  596.     bra    QuitErr
  597. DoType    *    (d2-fh)
  598.     movem.l    d1-d7,-(sp)
  599.     move.l    d2,d7    ; fh
  600.     moveq    #20,d6    ; 20 bytes a time
  601.     move.l    MFNode(pc),a0
  602.     lea    mfrn_Buffer(a0),a1
  603.     move.l    a1,d5    ; buffer
  604.     move.l    mfrn_CharsInBuff(a0),d4    ; len
  605. 1$    tst.l    d4
  606.     beq    3$
  607.     cmp.l    d6,d4
  608.     bge    2$
  609.     move.l    d4,d6
  610. 2$    move.l    #SIGBREAKF_CTRL_C,d1
  611.     CALLDOS    CheckSignal
  612.     tst.l    d0
  613.     bne    4$
  614.     move.l    d7,d1
  615.     move.l    d5,d2
  616.     move.l    d6,d3
  617.     sub.l    d6,d4
  618.     add.l    d6,d5
  619.     move.l    d4,-(sp)
  620.     moveq    #1,d4
  621.     CALLDOS    FWrite
  622.     move.l    (sp)+,d4
  623.     subq.l    #1,d0
  624.     beq    1$
  625.     JSRL    IoErr
  626.     move.l    d0,d1
  627.     moveq    #0,d2
  628.     JSRL    PrintFault
  629.     moveq    #-1,d0
  630.     movem.l    (sp)+,d1-d7
  631.     rts
  632. 3$    moveq    #0,d0
  633.     movem.l    (sp)+,d1-d7
  634.     rts
  635. 4$    lea    BreakTxt(pc),a0
  636.     bsr    PrintString
  637.     movem.l    (sp)+,d1-d7
  638.     moveq    #-2,d0
  639.     rts
  640. BreakTxt
  641.     dc.b    LF,'*** Break',LF,0
  642.     even
  643. MyPatchProc
  644.     lea    MyPatchProc-mfrn_PatchProc(pc),a0
  645.     btst    #MFRNB_TRACE,mfrn_Flags(a0)
  646.     beq    mppr_0
  647.     btst    #MFRNB_NOBELLS,mfrn_Flags(a0)
  648.     beq    mppr_5
  649.     cmpi.b    #BELL,d0
  650.     beq    mppr_0
  651. mppr_5    move.l    mfrn_CharsInBuff(a0),d1
  652.     move.l    d2,-(sp)
  653.     move.l    mfrn_BufferSize(a0),d2
  654.     cmp.l    d1,d2
  655.     beq    mppr_4
  656.     addq.l    #1,mfrn_CharsInBuff(a0)
  657.     lea    mfrn_Buffer(a0),a1
  658.     move.b    d0,(a1,d1.l)
  659. mppr_1    move.l    (sp)+,d2
  660. mppr_0    btst    #MFRNB_FLASH,mfrn_Flags(a0)
  661.     beq    mppr_2
  662.  
  663.     lea    $dff000,a1    ; this probably won't work on GFX boards
  664.     move.w    vhposr(a1),color(a1)    ;
  665.  
  666. mppr_2    btst    #MFRNB_SERIAL,mfrn_Flags(a0)
  667.     beq    mppr_3
  668.     move.l    mfrn_OldVector(a0),a0
  669.     jmp    (a0)
  670. mppr_3    rts
  671. mppr_4    bset    #MFRNB_OVERFLOW,mfrn_Flags(a0)
  672.     bra    mppr_1
  673. MyPatchProcE
  674. MyInitProc
  675.     lea    MyInitProc-mfrn_InitProc(pc),a0
  676.     andi.b    #~(MFRNF_PATCHED!MFRNF_TRACE),mfrn_Flags(a0)
  677. NullExit
  678.     moveq    #0,d0
  679. Exit    rts
  680. MyInitProcE
  681.  
  682. ****************************************************************************
  683.  
  684. MFNode    dc.l    0
  685. _DOSBase
  686.     dc.l    0
  687. MyInput    dc.l    0
  688. MyOutput
  689.     dc.l    0
  690. ArgPtr    dc.l    0
  691. InfoFormatArgs
  692.     dc.l    0,0,0,0,0
  693. CharsInBuffSpace
  694.     dc.l    0
  695. DosLibName
  696.     DOSNAME
  697. MyNameString
  698.     dc.b    'MungFriend',0
  699.     even
  700.     dc.b    '$VER: '
  701. MyIDString
  702.     dc.b    'MungFriend 3.7  (09.09.98) BLABLA PRODUCT',CR,LF,0
  703. MyTemplate
  704.     dc.b    'INFO=I/S,INSTALL=S/S,CLEAR=C/S,REMOVE=R/S,TYPE=T/S,WRITE=W/S,UPDATE=U/S,SIZE/N/K,TO,FLASH/S,NOFLASH/S,SERIAL/S,NOSERIAL/S,TRACE/S,NOTRACE/S,NOBELLS/S,BELLS/S',0
  705. BuffOverflow
  706.     dc.b    '*** WARNING: BUFFER OVERFLOW ***',LF,0
  707. TooManyCommands
  708.     dc.b    'Bad args - only ONE command allowed',LF,0
  709. FlagErrorTxt
  710.     dc.b    'Bad args - flags are mutual exclusive',LF,0
  711. NoCommand
  712.     dc.b    $1b,'[32mMungFriend 3.7',$1b,'[31m   by Szymon Pura, David Zaroski. FREEWARE - BLABLA PRODUCT',LF
  713.     dc.b    'USAGE:',LF
  714.     dc.b    '    MungFriend INFO|INSTALL|CLEAR|REMOVE|TYPE|WRITE|UPDATE [SIZE n]',LF
  715.     dc.b    '               [TO filespec] [FLASH|NOFLASH][TRACE|NOTRACE][SERIAL|NOSERIAL]',LF
  716.     dc.b    '               [BELLS|NOBELLS]',LF,LF
  717.     dc.b    '    MungFriend [<command> [<options>]]',LF,LF
  718.     dc.b    '           Where <command> is one of:',LF
  719.     dc.b    '   - info             - display some general info about current buffer',LF
  720.     dc.b    '   - install size <n> - create a new buffer (size in bytes)',LF
  721.     dc.b    '   - remove           - remove current buffer',LF
  722.     dc.b    '   - type             - type buffer contents',LF
  723.     dc.b    '   - write <filename> - write buffer contents to a file',LF
  724.     dc.b    '   - update           - update options,',LF
  725.     dc.b    '           And <options> are:',LF
  726.     dc.b    '   - serial           - allow serial output',LF
  727.     dc.b    '   - trace            - turn on exec/RawPutChar() tracing',LF
  728.     dc.b    '   - flash            - turn on flash mode',LF
  729.     dc.b    '   - bells            - allow console bells',LF,LF,0
  730. NotInstalledTxt
  731.     dc.b    'MungFriend is not installed!',LF,0
  732. InfoFormat
  733.     dc.b    'BuffSize: %ld  Options: %s  %s  %s  %s',LF
  734.     dc.b    'Characters in buffer: %ld',LF,0
  735. NoTraceT
  736.     dc.b    'NOTRACE',0
  737. NoFlashT
  738.     dc.b    'NOFLASH',0
  739. NoSerialT
  740.     dc.b    'NOSERIAL',0
  741. NoBellsT
  742.     dc.b    'NOBELLS',0
  743. BellsT    dc.b    'BELLS',0
  744. CantQuitTxt
  745.     dc.b    "Can't quit - someone is using RawPutChar() vector.",LF,0
  746. AlreadyInstalledTxt
  747.     dc.b    'MungFriend is already installed!',LF,0
  748. NoMemoryTxt
  749.     dc.b    'Not enough memory',LF,0
  750. NoBuffSizeTxt
  751.     dc.b    'Bad args - no buffer size',LF,0
  752. BadFileNameTxt
  753.     dc.b    'Bad args - filespec required',LF,0
  754.  
  755. ; we don't need this anymore
  756. ;Using10KBTxt
  757. ;    dc.b    'Allocated buffer: 10 KB',LF,0
  758.  
  759.     section    "args",BSS
  760. MyArgTable
  761.     ds.b    68
  762.